home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The X-Philes (2nd Revision)
/
The X-Philes Number 1 (1995).iso
/
xphiles
/
hp48_1
/
bfit_fv
< prev
next >
Wrap
Internet Message Format
|
1995-03-31
|
21KB
From: Fredrik Viklund <fv@LINK.Physchem.KTH.SE>
Subject: v04i028: bfit_fv - Flexible Least Square Fit v1.2, Part01/01
Newsgroups: comp.sources.hp48
Organization: Royal Institute of Technology, Stockholm
Followup-To: comp.sys.hp48
Approved: spell@seq.uncwil.edu
Checksum: 3297968093 (verify with brik -cv)
Submitted-by: Fredrik Viklund <fv@LINK.Physchem.KTH.SE>
Posting-number: Volume 4, Issue 28
Archive-name: bfit_fv/part01
BEGIN_DOC bfit.doc
Abstract:
~~~~~~~~~
Best Fit 1.2 is a user RPL-program that least-square-fits
a function to data points stored in SIGMADAT.
Best Fit 1.2 makes it easy to fit a (customized)
polynomial. It is possible to fit any function (with
some restrictions) to data.
Features:
~~~~~~~~~
o Userdefined function least square fit
o Simplified plots
o Easy to customize to fit your needs
Preface:
~~~~~~~~
Some time ago I wanted to fit a polynomial to some data. I then realized
that HP hadn't included that possibility in the '48. As I had some time
to spend, I wrote a simple routine that could fit a
polynom to a set of data. As this was my first "more-than-5-
lines-program"-project I changed it over and over again to see if I
could use some more predefined functions from the manuals... (Mostly,
the changes were made sitting in a bus on my way to school!)
Copyright:
~~~~~~~~~~
This program and documentation is (c) march 1992 Fredrik Viklund. If you
find it worthwile to use this program you have my permission to change
it on one condition! If you make any changes you have to change the
first line in ABOUT to "Modified Best Fit" and the version number to
"1.2m". If you distribute this program, please include the whole
unmodified directory and this documentation.
Disclaimer:
~~~~~~~~~~~
By using this program or reading more of this document I, the reader or
user agrees that the author, Fredrik Viklund has no responsibility
whatever of the results of the use of this program.
Introstructions:
~~~~~~~~~~~~~~~~
1. Download BFIT12 to your HP48
2. Press BFIT - a menu appears
(3. Press softkey 1 (A) to go to STAT menus, enter data in SIGMADAT, or
enter matrix and stor in SIGMADAT by pressing leftshift SIGMADAT.
There already are some data stored, so you don't have to enter data
right now. Then press right-shift SIGMADAT (softkey 1) to display
SIGMADAT)
4. Press FIT to fit data to function
5. Enter how many terms you want in your expression. Note that there
are three terms in a second degree polynomial (including a constant).
6. Press right-shift FIT to see matrix of least square fitted
coefficients.
7. Press ->EQ to make a readable equation of the coefficients. Press
right-shift ->EQ to see EQ were it is now stored. (Left-shift ->EQ
will store expression in level 1 in EQ.)
8. Press SCATR to make a scatterplot of data.
9. Press ATTN to return to plot menu.
10. Press FUNC to plot fitted function EQ.
11. Press ATTN to return to plot menu.
12. Press EXIT to return to main menu.
13. Press ABOUT to see name, version, copyright, my name and adress.
14. If you still reads this, press ATTN to leave ABOUT, then press OPERS
and EDIT.
15. Add \<< ln \>> as the 4th element (between \<< 2 ^ \>> and
\<< 3 ^ \>> ) and exit EDIT by pressing ENTER
16. Store new operators in OPER by pressing right-shift OPERS
17. Repeat steps 4 to 10 (use 4 or more terms in step 5)
18. Note the differences, and that EQ now contains a 'ln'-term.
Additional notes:
~~~~~~~~~~~~~~~~~
In menus: SCATR erases PICT and makes a autoscaled scatterplot
rightshifted SCATR plots data "as is"
FUNC plots function on current PICT (no ERASE)
It is not possible to fit such things as c1*SIN(c2*X) due to the method.
Only expressions like c*SIN(X) will work. (I think...)
These more spectacular functions may have their value if you want to fit
a smooth curve to you scatter.
Perhaps there are some undocumented features, but I leave that for you
to find out. I have already written too much...
Feed-Back:
~~~~~~~~~~
I would really appreciate if you let me know if you need, use or delete
this program.
+------------------------------------------------------+
| Fredrik Viklund FV@Chemstud.KTH.SE |
| Bussvaegen 5 |
| S-132 43 SALTSJO-BOO |
| SWEDEN |
+------------------------------------------------------+
O /
\/
/\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
O \
END_DOC
BEGIN_RPL bfit.rpl
%%HP: T(3)A(R)F(.);
DIR
BFIT @ Kind of a shell
\<< { { "\GSDAT" { @ 1st key
\<< 40 MENU @ normal: goto STAT-menu
\>> @
\<< STO\GS @ lshift: STO in \SIGMA-DAT
\>> @
\<< RCL\GS @ rshift: RCL \SIGMA-DAT
\>> } } { "FIT" @ 2nd key
{ @
\<< @
"Number of terms
in expression:"
"" INPUT OBJ\-> FIT @ normal: prompt and run FIT
\>> @
\<< @ lshift: NOOP
\>> @
\<< RESULT @ rshift: display RESULT
\>> } } { @
"OPERS" { @ 3rd key
\<< OPERS @
\>> @
\<< 'OPERS' STO @ normal: STO object in variable OPERS
\>> } } { "\->EQ" @ 4th key
{ \->EQ @ normal: make EQ from REUSLT
\<< 'EQ' STO @ lshift: STO object in EQ
\>> EQ } } { @ rshift: recall EQ
"PLOT" { @ 5th key (with submenu)
\<< { { "ERASE" @ 1st key: erase PICT
{ ERASE } } { @
"SCATT" { @ 2nd key: scatter \SIGMA-DAT
\<< SCATRPLOT @
GRAPH @
\>> @
\<< SCATTER @
DRAW GRAPH @
\>> } } { @
"FUNC" @ 3rd key: draw EQ
\<< FUNCTION @
DRAX DRAW GRAPH @
\>> } "" { @ 4th key: NOOP
"EXIT" BFIT } } @ 5th key: return to main menu
TMENU @
\>> } } { @
"ABOUT" { ABOUT } } @ 6th key: ABOUT BFIT
} TMENU @
\>> @
OPERS { @ Sample variable OPERS
\<< 0 ^ @ Contains the functions that form
\>> @ EQ.
\<< 1 ^ @
\>> @ In this case the first three terms
\<< 2 ^ @ will be X raised to 0, 1 and 2. Then
\>> @ SIN, EXP and 1/X -terms will be added.
\<< 3 ^ @
\>> @ If you omitt OPERS, FIT will make a
\<< 4 ^ @ "pure" polynomial (X raised to 0, 1, 2
\>> @ etc). Also if you specify 3 elements in
\<< 5 ^ @ OPERS and a 6 element-expression, FIT
\>> @ will use the three specified expressions
\<< SIN @ and then add X^(element number)
\>> @
\<< TAN @ If you want to fit c0+c1*X^0.5+c2*X
\>> @ OPERS would be:
\<< 8 ^ @ { \<< 0 ^ \>> \<< 0.5 ^ \>> \<< 1 ^ \>> }
\>> @
\<< 9 ^ @
\>> @
\<< 10 ^ @
\>> } @
FIT @ "Main" program
\<< \-> TERMS @ Get number of terms from level 1
\<< BFPAR 1 @ Store in 1st pos of PFPAR
TERMS PUT 'BFPAR' @
STO @
IF \GSDAT @ Check if \SIGMA-DAT is matrix (real
TYPE 3 \=/ \GSDAT TYPE @ or complex).
4 \=/ AND @
THEN # 601h @
DOERR @ Else "Invalid \SIGMA Data"
END \GSPAR 2 @ Get independent data column from \SIGMA-PAR
IFERR GET @ If \SIGMA-PAR does not exist: create
THEN { 1 2 @
0 0 LINFIT } '\GSPAR' @
STO GET @
END \GSPAR 1 @
GET \-> YCOLU XCOLU @ Store columns in YCOLU and XCOLU
\<< TERMS @
\GSDAT SIZE OBJ\-> DROP @
DROP \-> JSIZE ISIZE @ Store dimensions of Vandermonde matrix
\<< 1 ISIZE @ as ISIZE and JSIZE
FOR I @
\GSDAT { I XCOLU } @
GET \-> XI @ Get one element at a time. STO as Xi
\<< 0 @
TERMS 1 - @ Execute the right OPERS-operation
FOR J XI @ or raise to its j-th power
IFERR OPERS J 1 + @
GET EVAL @
THEN DROP DROP J @
^ @
END @
NEXT @
\>> @
NEXT { @
ISIZE JSIZE } \->ARRY @ When finished with all elements:
1 ISIZE @ make array (Vandermonde matrix)
FOR I @
\GSDAT { I YCOLU } @ Extract dependent data from Y-column
GET @ of \SIGMA-DAT
NEXT { @
ISIZE 1 } \->ARRY @
\>> \-> XDAT @ Store as XDAT and YDAT
YDAT @
\<< XDAT @ Calculation:
TRN YDAT * XDAT TRN @ TRN(X)*X*c = TRN(X)*Y
XDAT * \-> Y X @ c is the least-square-fitted coefficients
\<< Y X / @ in matrix format
Y X 3 PICK RSD X / @ Increase precision
+ @
\>> @
'RESULT' STO @ Store c in RESULT variable
\>> @
\>> @
\>> @
\>> @
RESULT @
[[ 1.00000006486 ] @
[ .999999927664 ] @
[ 1.00000000666 ] @
[ 1.00000008129 ]] @
\->EQ @
\<< -3 FS? @
IFERR PPAR 3 @ Make EQ-program
GET PPAR 7 GET @ Symbolic evaluation set?
THEN DROP @ Get independent and dependent variables
DROP 'X' 'Y' @ If nonexistant: assume 'X' and 'Y'
END BFPAR 1 @
GET \-> FLAG3 INDVAR @
DEPVAR TERMS @
\<< -3 CF @ Store as FLAG3, INDVAR and DEPVAR
RESULT OBJ\-> DROP @
TERMS 1 @ Set symbolic evaluation
FOR K @ Some magic performed on RESULT
INDVAR @ Principle: perform OPERS on INDEP,
IFERR @ multiply with coefficient and add
OPERS K GET EVAL @ together
THEN DROP @
DROP K 1 - ^ @
END * K @
ROLLD -1 @
STEP 1 @
TERMS 1 - @
FOR K SWAP @
+ @
NEXT 'EQ' @
STO @
IF FLAG3 1 @
== @ Store in EQ
THEN -3 SF @ Restore flag -3 as found earlier
END @
\>> @
\>> @
EQ '1.00000006486 @ Sample Equation
+.999999927664*X+ @
1.00000000666*X^2+ @
1.00000008129*LN(X) @
' @
\GSDAT @ Sample \SIGMA-DAT
[[ 1 -7 ] @
[ 2 -33.5342640972 ] @
[ 3 -83.5069385566 ] @
[ 4 -156.068528194 ] @
[ 5 -250.952810438 ] @
[ 6 -368.041202654 ]] @
\GSPAR { 1 2 0 0 @ Sample \SIGMA-PAR
LINFIT } @
PPAR { @ Sample PPAR
(1,-1.44141568686) @
(5,32.6094379124) X @
0 (0,0) FUNCTION Y @
} @
BFPAR { 4 } @ Sample BFPAR (contains number of terms)
ABOUT @ About BFIT
\<< CLLCD @
" Best Fit" 1 @
DISP @
" ver 1.2 \169 1992" @
3 DISP @
" Fredrik Viklund" @
5 DISP @
" FV@Chemstud.KTH.SE" @
7 DISP 7 FREEZE @
\>> @
END @
END_RPL
BEGIN_ASC bfit.asc
%%HP: T(3)A(R)F(.);
"69A20FF705D0000000501424F4554550D9D20E1632858A1C2A20320000202020
202020224563747026496479C2A2485A1C2A20B2000020202026756270213E22
302029A02139393233F2A2485A1C2A20B2000020202642756462796B60202659
6B6C657E646D13A2485A1C2A20D20000202646504348656D637475746E2B4458
4E23554743A2485A1743A24A5A193632B2130311005024640514255047A20803
A2B2130D100040050514254047A2077920000000000000001000068686514144
19779200000000000000050100421973490623084E2010854B2A277920000000
00000000000000000000000000166E184E201095B21301A00040580514254047
A209C2A2ED2A24B2A24B2A21B102B2130F20004058441445408E9209D0003392
0200006000020000000000000000001000000000000000790000000000000020
1002790462435339000000000000003010066558396053890000000000000040
2004918258606519000000000000005020083401825905290000000000000060
2004562021408639AE000205415208BA20339200006846000000010339209994
66729999999084E201085EEDA176BA133920000666000000001084E201085ED2
A2D20B1EEDA176BA133920000921800000001084E201085F49B1EEDA176BA1B2
130EA00030D8541530D9D20E16320B3A2313C1FD332D9D2084E2040050514253
F2A26C7D184E204005051425743A26C7D1B2130F1732D9D208DBF18DBF145632
84E201085976324563284E20109597632B21305DF2284E205024640514259C2A
26C7D11C432D6E205064C4147433D6E206094E444651425D6E20604454056514
25D6E2050455425D435E16320B3A25D2C184E206025543555C445B7FC18DBF1D
6E2050455425D4359C2A20A132D6E2010B4D6E206094E444651425FD332D9D20
84E2050F405542535D6E2010B46C7D1EB3A1B2130F1732D9D208DBF18DBF1D6E
2010B49C2A290DA1D20B1B21305DF22EEDA1D6E2010B40DCF1683A2083329C2A
2D6E2050455425D4359C2A290DA10A132D6E2010B4DBBF176BA1C42324563284
E2020541597632DCC023CE22D6E205064C41474339C2A2279E1AFE22D9D200B3
A2472C1B21305DF22EF53293632B2130892006025543555C445608E920950003
3920200004000010000000684600000001099946672999999900006660000000
0100009218000000010E60003064944530D9D20E16321C432D6E2050455425D4
35E163284E205024640514259C2A2D6E2050455425D435704D14563284E20502
46405142597632DCC023CE2284E20405844144568BC13F2A2D9AE184E2040584
4144568BC1803A2D9AE1387E1AFE22D9D20E4A20510001060000000000000933
A1B21305DF2284E204058051425ED2A2FD3326C7D1F1732D9D2047A209C2A2ED
2A24B2A24B2A21B102B21304563284E20405805142597632DCC026C7D1B21305
DF2284E2040580514259C2A26C7D11C432D6E20509534F4C455D6E20508534F4
C455E1632D6E2050455425D43584E2040584414458B9C1B7FC18DBF18DBF11C4
32D6E2050A43594A554D6E2050943594A554E16329C2A2D6E2050943594A5540
A132D6E20109484E20405844144547A20D6E201094D6E20508534F4C455B2130
6C7D11C432D6E20208594E16324B2A2D6E2050455425D4359C2A290DA10A132D
6E2010A4D6E20208594FD332D9D2084E2050F405542535D6E2010A49C2A276BA
16C7D1EB3A1B2130F1732D9D208DBF18DBF1D6E2010A4D20B1B21305DF22C423
2EF532C423247A20D6E2050943594A554D6E2050A43594A554B2130900D19C2A
2D6E2050943594A5540A132D6E20109484E20405844144547A20D6E201094D6E
20509534F4C455B21306C7D1C423247A20D6E2050943594A5549C2A2B2130900
D1EF5321C432D6E204085441445D6E204095441445E1632D6E20408544144529
3D1D6E204095441445EEDA1D6E204085441445293D1D6E204085441445EEDA11
C432D6E201095D6E201085E1632D6E201095D6E20108550FA1D6E201095D6E20
10853F2A2A9CF1E30C1D6E20108550FA176BA1EF5324563284E206025543555C
44597632DCC02EF532EF532EF53293632B2130E050050F4055425355047A20D9
D20E16324B2A2D20B193632B2130D9D20E16329C2A2D20B193632B2130D9D20E
1632ED2A2D20B193632B2130D9D20E16323F2A2D20B193632B2130D9D20E1632
803A2D20B193632B2130D9D20E1632D13A2D20B193632B2130D9D20E1632CA4B
193632B2130D9D20E1632E55B193632B2130D9D20E1632C53A2D20B193632B21
30D9D20E1632173A2D20B193632B2130D9D20E1632339201000000000000010D
20B193632B2130B213086100402464944540D9D20E163247A2047A20C2A20D00
005844144547A20D9D20E16323392010000000000000406911293632B2130D9D
20E1632B0DF193632B2130D9D20E163264DF193632B2130B2130B213047A20C2
A20B000064944547A20D9D20E1632C2A2014000E457D626562702F6660247562
7D637A096E6025687072756373796F6E6A3C2A2050000AC422B7FC184E203064
944593632B2130D9D20E163293632B2130D9D20E163284E206025543555C4459
3632B2130B2130B213047A20C2A20F0000F40554253547A20D9D20E163284E20
50F40554253593632B2130D9D20E16324563284E2050F40554253597632DCC02
93632B2130B2130B213047A20C2A20B0000D8541547A2084E2030D85415D9D20
E16324563284E2020541597632DCC0293632B213084E20205415B2130B213047
A20C2A20D000005C4F44547A20D9D20E163247A2047A20C2A20F000054251435
5447A20F52E1B2130B213047A20C2A20F0000353414454547A20D9D20E1632C8
102AB2E193632B2130D9D20E1632107E1091E1AB2E193632B2130B2130B21304
7A20C2A20D00006455E434D9D20E1632166E16C1E1091E1AB2E193632B2130B2
130C2A205000047A20C2A20D00005485944584E204024649445B2130B2130D51
1293632B2130B2130B213047A20C2A20F00001424F4554547A2084E20501424F
45545B2130B2130B2130D511293632B21304177"
END_ASC
BYTES: #7714h 2234
BEGIN_UU bfit.uue
begin 644 bfit
M2%!(4#0X+466*O!_4`T````%04)/550%G2W@82-8J,&B`B,```("`@("`B)4
M-D<'8I1&ERPJA*7!H@(K```"`@)B5R8'$N,B`P*2"A*3DR,S+RJ$I<&B`BL`
M``("8B171B:7M@8"8I6VQE;G1M8Q*H2EP:("+0```F)D!32$5M8V1U='YK)$
MA>0R570T*H2E<30JI*618R,K,3`1``5"1E!!4@5T*H`P*BLQT`$`!%!005($
M="IPEP(``````````0!@:&@5%$21=RD`````````4!``))$WE&`R@.0"`5BT
MHG*7`@````````````````````!AYH'D`@%9*S$0"@`$A5!!4@1T*I`L*MZB
M0BLJM*(2&R`K,?`"``2%1$%4!.@ID`T`,RD@```&`"`````````````!````
M`````)<``````````@$@ET`F-#63``````````,!8%:%DP8UF``````````$
M`D`9*(4&5I$`````````!0*`0Q`HE5"2``````````8"0&4"$@1HD^H`(%`4
M)8"K`C,I``"&9````!`PDP*9268GF9F9"4@N$(#EWAIGJS&3`@!@9@`````!
M2"X0@.4M*BVPX=X:9ZLQDP(`D!((`````4@N$(#UE!ONK7&V&BLQX`H``XU%
M40.=+>!A(["C,C$<WS/2V0)(+D``!14D-2\JQM>!Y`($4%!!4D>C8GP=*S'P
M<2.=+8"]']C[064C2"X0@)5G(U0V@N0"`5EY-K(2`]4O@N0"!4)&4$%2R:)B
M?!W!--+F`@5&3$%',VTN8)#D1&05)-7F`@9$15!605)M+E!`5235-.5A(["C
M4BT<2"Y@(%4T5<5$M?<<V/O1Y@(%5$5235/)H@(:(VTN$+#4Y@(&24Y$5D%2
MWS/2V0)(+E#P!%4D-=7F`@%+QM?A.QHK,?!Q(YTM@+T?V/O1Y@(!2\FBDM`:
M+;"Q$@/5+^+>&FTN$+`$S1^&HP(X(\FBTN8"!51%4DU3R:*2T!J@,=+F`@%+
MO?MQMAI,,D)E(T@N(%`4E6<CS0PR[")M+E!@Q!1T-),L*G+IH>\BG2T`.RIT
MPK$2`]4OXE\C.3:R$@.8`F`@5315Q41E@)X"60`PDP("`$````$```"&9```
M`!"0F61VDIF9F0``9@8````0```I@0```!#@!@`#1DE4`YTMX&$CP332Y@(%
M5$5235,>-H+D`@5"1E!!4LFBTN8"!51%4DU3!]1!92-(+E`@9`05))5G(\T,
M,NPB2"Y`4$@41&6X'/.BTJD>2"Y`4$@41&6X'`BCTJD>@^>A[R*=+>"D`A4`
M$&````````"0,QHK,5#](D@N0%`(%23E+2K?,V)\'1\WTMD"="J0+"K>HD(K
M*K2B$AL@*S%`92-(+D!0"!4DE6<CS0QB?!TK,5#](D@N0%`(%225+"K&UQ%,
M(VTN4)`U],14U>8"!5A#3TQ5'C;2Y@(%5$5235-(+D!02!1$A9L<>\^!O1_8
M^Q%,(VTN4*`TE:15U.8"!4E325I%'C:2+"IM+E"0-)6D500:(VTN$)"$Y`($
MA41!5'0JT.8"`4EM+E"`-?3$5+42`\;7$4PC;2X@@)7D82.THM+F`@5415)-
M4\FBDM`:H#'2Y@(!2FTN(("5]#TCG2V`Y`(%3U!%4E-M+A"@E"PJ9ZMA?!V^
MH[$2`Q\WTMD"V/N!O1]M+A"@U`(;*S%0_2),,N)?(TPR0J<";2Y0D#25I%74
MY@(%2E-)6D4K,9``'<FBTN8"!4E325I%H#'2Y@(!24@N0%!(%$1%IP)M+A"0
MU.8"!5E#3TQ5*S%@?!U,,D*G`FTN4)`TE:15E"PJ*S&0`!W^-1),(VTN0(!%
M%$35Y@($641!5!XVTN8"!%A$0522T]'F`@191$%4[JW1Y@($6$1!5)+3T>8"
M!%A$053NK1%,(VTN$)#5Y@(!6!XVTN8"`5EM+A"`5?`:;2X0D-7F`@%8\Z*B
MR1\^P-'F`@%8!:]QMAK^-4)E(T@N8"!5-%7%1)5G(\T,XE\C_C7B7R,Y-K(2
M`PX%4/`$520U54"G`ITMX&$CM*+2`ALY-K(2`YTMX&$CR:+2`ALY-K(2`YTM
MX&$CWJ+2`ALY-K(2`YTMX&$C\Z+2`ALY-K(2`YTMX&$C"*/2`ALY-K(2`YTM
MX&$C':/2`ALY-K(2`YTMX&$CK+218R,K,=#9`AXVXE4;.3:R$@.=+>!A(URC
MT@(;.3:R$@.=+>!A(W&CT@(;.3:R$@.=+>!A(S,I$````````!#0`ALY-K(2
M`RLQ@!8`!$)&250$G2W@82-T*D"G`BPJT```A41!5'0JT-D"'C8RDP(!````
M````!)81DF,C*S'0V0(>-K+0'SDVLA(#G2W@82-&_9%C(RLQL!(#*S%`IP(L
M*K```$9)5'0JT-D"'C;"H@)!`.!4UR96)@?R9@9"5R;7-J>0Y@92A@<G5S8W
ME_;FIL.B`@4`H$PB>\^!Y`(#1DE4.3:R$@.=+>!A(SDVLA(#G2W@82-(+F`@
M5315Q4258R,K,;`2`RLQ0*<"+"KP``!/4$524W0JT-D"'C:"Y`(%3U!%4E,Y
M-K(2`YTMX&$C5#:"Y`(%3U!%4E-Y-M+,(#DVLA(#*S&P$@-T*L"B`@L`T%@4
M1:<"2"XPT%@4U=D"'C9"92-(+B!0%)5G(\T,DF,C*S&`Y`("15$K,;`2`W0J
MP*("#0``Q?1$1:<"G2W@82-T*D"G`BPJ\```15)!4T5T*O`E'BLQL!(#="K`
MH@(/`#`U%$1%1:<"G2W@82.,`:(K'CDVLA(#G2W@82,!YP$9'KKBD6,C*S&P
M$@,K,4"G`BPJT```1E5.0YTMX&$C8>9A'!Z0X:$K'CDVLA(#*S'`H@(%`$"G
M`BPJT```15A)5$@N0"!DE$2U$@,K,=`5(3DVLA(#*S&P$@-T*L"B`@\`$"3T
=5$5%IP)(+E`0)/141;42`RLQL!(#71&28R,K,0`K
`
end
END_UU